package com.iteaj.iot.plc.melsec;

import com.github.xingshuangs.iot.exceptions.McCommException;
import com.github.xingshuangs.iot.protocol.melsec.enums.EMcFrameType;
import com.github.xingshuangs.iot.protocol.melsec.model.*;
import com.iteaj.iot.message.DefaultMessageHead;
import com.iteaj.iot.plc.PlcClientProtocol;
import com.iteaj.iot.plc.PlcProtocolType;
import com.iteaj.iot.utils.ByteUtil;

public class MelsecMessageHeader extends DefaultMessageHead {


    /**
     * Frame type.
     * (帧类型)
     */
    protected EMcFrameType frameType = EMcFrameType.FRAME_3E;

    /**
     * Sub header, 2-bytes.
     * 副帧头，2字节，根据报文的类型定义设置的值。
     * 1E帧，1个字节
     */
    protected int subHeader = 0;

    /**
     * Access route.
     * 访问路径，存在多种访问路径
     */
    protected McAccessRoute accessRoute;

    /**
     * Monitoring timer.
     * 监视定时器，2字节，设置读取及写入的处理完成之前的等待时间。设置连接站E71向访问目标发出处理请求之后到返回响应为止的等待时间。
     * 0000H(0): 无限等待(处理完成之前继续等待。)<br>
     * 0001H～FFFFH(1～65535): 等待时间(单位: 250ms)<br>
     * 连接站(本站):0001H～0028H(0.25秒～10秒)
     * 其它站:0002H～00F0H(0.5秒～60秒)
     */
    protected int monitoringTimer;


    public MelsecMessageHeader() {
        super(null, null, PlcProtocolType.Melsec);
    }

    protected MelsecMessageHeader(byte[] message) {
        super(message);
    }

    protected MelsecMessageHeader(String messageId) {
        super(null, messageId, PlcProtocolType.Melsec);
    }

    public MelsecMessageHeader(String equipCode, String messageId) {
        super(equipCode, messageId, PlcProtocolType.Melsec);
    }

    public static MelsecMessageHeader buildRequestHeader(EMcFrameType frameType, McAccessRoute accessRoute, int timer) {
        switch (frameType) {
            case FRAME_1E:
                return new MelsecMessageHeader1E(accessRoute, timer);
            case FRAME_3E:
                return new MelsecMessageHeader3E(accessRoute, timer);
            case FRAME_4E:
                return new MelsecMessageHeader4E(accessRoute, timer);
            default:
                throw new McCommException("unknown frame type");
        }
    }

    /**
     * @see PlcClientProtocol#sendRequest() 使用channelId作为messageId
     * @param messageId
     */
    @Override
    public MelsecMessageHeader setMessageId(String messageId) {
        return (MelsecMessageHeader) super.setMessageId(messageId);
    }
}
